package com.qf.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.qf.pojo.Customer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

/**
 *
 * 搜索管理
 * @author lixu
 */
@RestController
@RequestMapping("/search")
public class SearchController {

    @Value("${server.port}")
    private String serverPort;
    /**
     * 搜索结果
     */
    @GetMapping("/result")
    @HystrixCommand(fallbackMethod = "fallbackException",commandProperties = {
            //SEMAPHORE ： Tomcat服务器线程池   300~500
            //THREAD：     断路器线程池： 几百个线程
            @HystrixProperty(name = "execution.isolation.strategy",value = "THREAD"),//常用的线程池
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })//抛出异常时  //断路器遇到了异常触发降级处理
    public String result(){
        int i = 1/0;
        return "我是搜索微服务:" + serverPort;
    }
    //降级处理的方法
    public String fallbackException(){

        return "我是搜索微服务,不好意思。我出异常了!!";
    }

    /**
     * 传递单个简单的参数
     */
    @GetMapping("/param1/{name}/{age}")
    public String param1(@PathVariable String name, @PathVariable Integer age){
        //System.out.println("name:" + name);
        //System.out.println("age:" + age);

        return "OK";
    }
    /**
     * 传递对象 或集合 或是数组  Map
     */
    @PostMapping("/param2")
    public Customer param2(@RequestBody Customer customer){
        System.out.println(customer);
        customer.setId(666);
        customer.setName("刘德华");
        return customer;
    }

    /**
     * 模拟根据id查询
     *    一、在没有使用断路器的时候：使用的Tomcat线程池
     *    二、在使用断路器的时候：默认是使用断路器线程池
     *        *   线程隔离：
     *             2.1断路器:open情况下 拒绝外界的访问 此时使用的Tomcat线程池
     *             2.2断路器:closed情况下 接收外界的访问 此时使用的断路器线程池
     * @param id
     */
    @GetMapping("/{id}")
    @HystrixCommand(fallbackMethod = "findByIdFallBack",commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "70"),
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "5000")
    })
    public Customer findById(@PathVariable Integer id) throws Exception {

        System.out.println("=====我被调用了");
        //System.out.println("Tomcat:" + Thread.currentThread().getName());
/*        if(id == 123){
            int i = 1/0;
        }*/
        //Thread.sleep(300);
        return new Customer(1,"张三",23);
    }
    /**
     * findById的降级方法  方法的描述要和接口一致
     */
    public Customer findByIdFallBack(Integer id){
        System.out.println("断路器线程池:" + Thread.currentThread().getName());
        return new Customer(-1,"",0);
    }


}
